package repository

import (
	"fmt"

	"github.com/yourusername/rss-reader-ai/internal/model"
	"gorm.io/gorm"
)

// =====================================================
// FeedRepository 接口定义
// =====================================================

// FeedRepository 订阅源数据访问接口
type FeedRepository interface {
	// Create 创建订阅源
	Create(feed *model.Feed) error

	// GetByID 根据ID获取订阅源
	GetByID(id int64) (*model.Feed, error)

	// GetByURL 根据URL获取订阅源
	GetByURL(url string) (*model.Feed, error)

	// List 获取所有订阅源
	List() ([]*model.Feed, error)

	// ListByCategory 根据分类获取订阅源
	ListByCategory(category string) ([]*model.Feed, error)

	// ListActive 获取所有启用的订阅源
	ListActive() ([]*model.Feed, error)

	// GetActiveFeeds 获取所有启用的订阅源（ListActive 的别名，更符合命名习惯）
	GetActiveFeeds() ([]*model.Feed, error)

	// ListNeedFetch 获取需要抓取的订阅源
	// 条件: is_active=true AND (last_fetched_at IS NULL OR 距离上次抓取 >= fetch_interval)
	ListNeedFetch() ([]*model.Feed, error)

	// Update 更新订阅源
	Update(feed *model.Feed) error

	// UpdateFields 更新指定字段
	UpdateFields(id int64, fields map[string]interface{}) error

	// Delete 删除订阅源(级联删除文章)
	Delete(id int64) error

	// Count 统计订阅源数量
	Count() (int64, error)

	// CountByCategory 统计分类下的订阅源数量
	CountByCategory(category string) (int64, error)
}

// =====================================================
// FeedRepository 接口实现
// =====================================================

// feedRepository 订阅源数据访问实现
type feedRepository struct {
	db *gorm.DB
}

// NewFeedRepository 创建订阅源数据访问实例
func NewFeedRepository(db *gorm.DB) FeedRepository {
	return &feedRepository{db: db}
}

// Create 创建订阅源
func (r *feedRepository) Create(feed *model.Feed) error {
	if feed == nil {
		return fmt.Errorf("feed不能为空")
	}
	return r.db.Create(feed).Error
}

// GetByID 根据ID获取订阅源
func (r *feedRepository) GetByID(id int64) (*model.Feed, error) {
	var feed model.Feed
	err := r.db.First(&feed, id).Error
	if err != nil {
		if err == gorm.ErrRecordNotFound {
			return nil, fmt.Errorf("订阅源不存在: id=%d", id)
		}
		return nil, fmt.Errorf("查询订阅源失败: %w", err)
	}
	return &feed, nil
}

// GetByURL 根据URL获取订阅源
func (r *feedRepository) GetByURL(url string) (*model.Feed, error) {
	var feed model.Feed
	err := r.db.Where("url = ?", url).First(&feed).Error
	if err != nil {
		if err == gorm.ErrRecordNotFound {
			return nil, fmt.Errorf("订阅源不存在: url=%s", url)
		}
		return nil, fmt.Errorf("查询订阅源失败: %w", err)
	}
	return &feed, nil
}

// List 获取所有订阅源
func (r *feedRepository) List() ([]*model.Feed, error) {
	var feeds []*model.Feed
	err := r.db.Order("created_at DESC").Find(&feeds).Error
	if err != nil {
		return nil, fmt.Errorf("查询订阅源列表失败: %w", err)
	}
	return feeds, nil
}

// ListByCategory 根据分类获取订阅源
func (r *feedRepository) ListByCategory(category string) ([]*model.Feed, error) {
	var feeds []*model.Feed
	err := r.db.Where("category = ?", category).
		Order("created_at DESC").
		Find(&feeds).Error
	if err != nil {
		return nil, fmt.Errorf("查询分类订阅源失败: %w", err)
	}
	return feeds, nil
}

// ListActive 获取所有启用的订阅源
func (r *feedRepository) ListActive() ([]*model.Feed, error) {
	var feeds []*model.Feed
	err := r.db.Where("is_active = ?", true).
		Order("created_at DESC").
		Find(&feeds).Error
	if err != nil {
		return nil, fmt.Errorf("查询启用订阅源失败: %w", err)
	}
	return feeds, nil
}

// GetActiveFeeds 获取所有启用的订阅源（ListActive 的别名）
func (r *feedRepository) GetActiveFeeds() ([]*model.Feed, error) {
	return r.ListActive()
}

// ListNeedFetch 获取需要抓取的订阅源
func (r *feedRepository) ListNeedFetch() ([]*model.Feed, error) {
	var feeds []*model.Feed
	
	// 查询条件:
	// 1. 启用状态
	// 2. 从未抓取过 OR 距离上次抓取时间 >= 抓取间隔
	err := r.db.Where("is_active = ?", true).
		Where(r.db.Where("last_fetched_at IS NULL").
			Or("TIMESTAMPDIFF(SECOND, last_fetched_at, NOW()) >= fetch_interval")).
		Order("last_fetched_at ASC NULLS FIRST"). // 从未抓取的优先
		Find(&feeds).Error
	
	if err != nil {
		return nil, fmt.Errorf("查询待抓取订阅源失败: %w", err)
	}
	return feeds, nil
}

// Update 更新订阅源
func (r *feedRepository) Update(feed *model.Feed) error {
	if feed == nil {
		return fmt.Errorf("feed不能为空")
	}
	if feed.ID == 0 {
		return fmt.Errorf("feed ID不能为0")
	}
	
	// Save 会更新所有字段(包括零值)
	return r.db.Save(feed).Error
}

// UpdateFields 更新指定字段
func (r *feedRepository) UpdateFields(id int64, fields map[string]interface{}) error {
	if len(fields) == 0 {
		return fmt.Errorf("更新字段不能为空")
	}
	
	result := r.db.Model(&model.Feed{}).
		Where("id = ?", id).
		Updates(fields)
	
	if result.Error != nil {
		return fmt.Errorf("更新订阅源字段失败: %w", result.Error)
	}
	
	if result.RowsAffected == 0 {
		return fmt.Errorf("订阅源不存在: id=%d", id)
	}
	
	return nil
}

// Delete 删除订阅源
func (r *feedRepository) Delete(id int64) error {
	result := r.db.Delete(&model.Feed{}, id)
	if result.Error != nil {
		return fmt.Errorf("删除订阅源失败: %w", result.Error)
	}
	if result.RowsAffected == 0 {
		return fmt.Errorf("订阅源不存在: id=%d", id)
	}
	return nil
}

// Count 统计订阅源数量
func (r *feedRepository) Count() (int64, error) {
	var count int64
	err := r.db.Model(&model.Feed{}).Count(&count).Error
	if err != nil {
		return 0, fmt.Errorf("统计订阅源数量失败: %w", err)
	}
	return count, nil
}

// CountByCategory 统计分类下的订阅源数量
func (r *feedRepository) CountByCategory(category string) (int64, error) {
	var count int64
	err := r.db.Model(&model.Feed{}).
		Where("category = ?", category).
		Count(&count).Error
	if err != nil {
		return 0, fmt.Errorf("统计分类订阅源数量失败: %w", err)
	}
	return count, nil
}
